﻿//C# 如何提高两个列表数据对比性能
//时序数据，DataTime Value   100000   去重orUpdate   insert
//db_list    new_list
//for new_list   for db_list
//https://cloud.tencent.com/developer/article/2162348
List<Data> db_list = new List<Data>();//100000
List<Data> new_list = new List<Data>();//100000
Random random = new Random();
DateTime time=Convert.ToDateTime("2025-01-01 00:00:00");
Console.WriteLine(DateTime.Now);
for(int i = 0;i<100000;i++)
{
    int min = random.Next(200000);
    db_list.Add(new Data() { Time=time.AddMinutes(i),Value=random.Next(100)});
    new_list.Add(new Data() { Time = time.AddMinutes(min), Value = random.Next(100) });
}
Console.WriteLine(DateTime.Now);
List<Data> updates = new List<Data>();
List<Data> adds = new List<Data>();
Console.WriteLine("匹配:"+DateTime.Now);
#region 方案1
//for (int i = 0; i < new_list.Count; i++)
//{
//    var data=new_list[i];
//    //bool isadd = true;
//    var item=db_list.FirstOrDefault(t=>t.Time==data.Time);
//    if (item == null)
//    {
//        adds.Add(data);
//    }
//    else if (item.Value!=data.Value)
//    {
//        updates.Add(data);
//    }
//    //for (int j = 0; j < db_list.Count; j++)
//    //    {
//    //        var item = db_list[j];
//    //        if (item.Time == data.Time && item.Value != data.Value)
//    //        {
//    //            updates.Add(data);
//    //            isadd = false;
//    //            break;
//    //        }
//    //    }
//    //if (isadd)
//    //{
//    //    adds.Add(data);
//    //}
//}
#endregion
Dictionary<string,Data> dict_db = new Dictionary<string,Data>();
for(int i = 0; i < db_list.Count; i++)
{
    var data=db_list[i];
    string key=data.Time.ToString("yyyyMMddHHmmss");
    dict_db.Add(key, data);
}
for(int i = 0; i < new_list.Count; i++)
{
    var data=new_list[i];
    string key = data.Time.ToString("yyyyMMddHHmmss");
    if (dict_db.ContainsKey(key))
    {
        var item=dict_db[key];
        if (data.Value != item.Value)
        {
            updates.Add(data);
        }
    }
    else
    {
        adds.Add(data);
    }
}
Console.WriteLine("匹配:" + DateTime.Now);
Console.WriteLine(adds.Count);
Console.WriteLine(updates.Count);


class Data
{
    public DateTime Time { get; set; }
    public int Value {  get; set; }
}